package com.fxyk.webclick.bace;

import org.testng.Assert;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.PageFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.Duration;
import java.util.concurrent.TimeUnit;

public class 公共页面父类 {
    //声明日志，显示子类操作
    Logger logger= LoggerFactory.getLogger(this.getClass());
    private static WebDriver 浏览器驱动;


    public static WebDriver get浏览器驱动() {
        return 浏览器驱动;
    }

    public static void set浏览器驱动(String driverName) {

        if ("Chrome".equals(driverName)) {
            浏览器驱动 = new ChromeDriver();
        }else if ("Firefox".equals(driverName)){
            浏览器驱动=new FirefoxDriver();
        }else{
            System.out.println("当前只支持Firefox和Chrome浏览器，不支持"+driverName+"浏览器");
        }
        浏览器驱动.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        浏览器驱动.manage().window().maximize();
    }
//      构造方法：public+类名，特点1.不需要写返回值类型，甚至void也不写；2.方法名必须和类名一致
    public 公共页面父类(){
        String[] 类名=this.getClass().toString().split("\\.");
        String 网页名 =类名[类名.length-1].substring(0,类名.length-1);
        logger.info("开始执行测试用例:"+ 网页名 +"测试。");
        logger.info("打开网页:"+ 网页名 +"。");
        PageFactory.initElements(浏览器驱动,this);
    }
    //    封装常用元素操作方法，便于扩展
    public void 输入内容(WebElement 网页元素,String 输入数据){
        logger.info("向输入框["+网页元素.toString().split(" ->")[1]+ "，输入内容："+输入数据+"。");
//        网页元素.clear();
        网页元素.sendKeys(输入数据);
    }
    public void 点击(WebElement 网页元素){
        logger.info("点击网页元素["+网页元素.toString().split(" ->")[1]+ "。");
        网页元素.click();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
    public void 双击(WebElement 网页元素){
        new Actions(浏览器驱动).doubleClick(网页元素).perform();
    }
    public void 清空(WebElement 网页元素){
        logger.info("清空输入框:["+网页元素.toString().split(" ->")[1]+ "内容。");
        网页元素.clear();
    }
    public void 鼠标悬浮(WebElement 网页元素){
        logger.info("鼠标悬浮到网页元素:["+网页元素.toString().split(" ->")[1]+ "上。");
        new Actions(get浏览器驱动()).moveToElement(网页元素).perform();
    }
    public void 关闭浏览器页签(){
        浏览器驱动.close();
        for(String item:浏览器驱动.getWindowHandles()){
            浏览器驱动.switchTo().window(item);

        }
    }
    //封装页面检查方法
    public void 检查结果包含指定内容(WebElement 网页元素, String 预期内容){
        logger.info("预期结果："+预期内容+";实际结果：["+网页元素.toString().split("->")[1]+"。");
        Assert.assertTrue(网页元素.getText().contains(预期内容));
    }
    public void 检查页面跳转(String 期望url){
        logger.info("预期结果："+期望url+";实际结果："+get浏览器驱动().getCurrentUrl());
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        Assert.assertEquals(get浏览器驱动().getCurrentUrl(),期望url);
    }
    public void 检查页面标题(String 浏览器标题){
        logger.info("预期结果："+浏览器标题+";实际结果："+get浏览器驱动().getTitle());
        Assert.assertEquals(get浏览器驱动().getTitle(),浏览器标题);
    }

}
